package com.base.common.network;

import com.base.common.util.StringUtils;
import com.base.common.util.log.LogUtil;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * Json解析实体
 */
public class JsonHelper {

	public static final String TAG = JsonHelper.class.getName();
	static Gson mGson;
	static {
		mGson = new Gson();
	}

	public static String getJson(Object object) {
		return mGson.toJson(object);
	}

	/**
	 * 获取返回的业务实体信息
	 * 
	 * @param <T>
	 * @param
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getData(String json, Class<T> cls) {
		T t = null;
		try {
			t = mGson.fromJson(json, cls);
		} catch (Exception e) {
			if (e != null) {
				LogUtil.w(TAG, StringUtils.getExceptionMsg(e));
			}
		}
		return t;
	}

	/**
	 * 从Json中获取某个List
	 * 
	 * @param json
	 * @param type
	 *            java.lang.reflect.Type type = new
	 *            com.google.gson.reflect.TypeToken<List<cls>>() { }.getType();
	 * @param parameter
	 *            List对应的参数名
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static ArrayList getList(String json, Type type, String parameter) {
		// 创建一个JsonParser
		JsonParser parser = new JsonParser();
		JsonObject jsonObj = null;
		ArrayList result = null;
		try {
			JsonElement jsonEl = parser.parse(json);

			if (parameter == null) {
				JsonArray paraStr = jsonEl.getAsJsonArray();
				result = mGson.fromJson(paraStr, type);
			} else {
				jsonObj = jsonEl.getAsJsonObject();// 转换成Json对象
				JsonArray paraStr = jsonObj.get(parameter).getAsJsonArray();// parameter节点
				result = mGson.fromJson(paraStr, type);
			}

		} catch (Exception e) {
			if (e != null) {
				LogUtil.w(TAG, StringUtils.getExceptionMsg(e));
			}
		}
		return result;
	}

	 public static String parserMap(Map<String, String> map) {
		  return mGson.toJson(map);
		 }
	
	/***************************************************************************
	  * 解析Json到Map V2，支持潜入基本类型及数组
	  * 
	  * @param json
	  * @return
	  */
	 public static Object parserJsonToMapV2(String json) {
	  JsonParser jsonParser = new JsonParser();
	  JsonElement jsonElement = jsonParser.parse(json);
	  if (jsonElement.isJsonArray()) {
	   return parserArrays(jsonElement.getAsJsonArray());
	  } else if (jsonElement.isJsonNull()) {
	   return null;
	  } else if (jsonElement.isJsonObject()) {
	   return parserJsonObjecet(jsonElement.getAsJsonObject());
	  } else if (jsonElement.isJsonPrimitive()) {
	   return jsonElement.getAsString();
	  }
	  return null;
	 }

	 private static List<Object> parserArrays(JsonArray jsonArray) {
		  List<Object> list = new ArrayList<Object>();
		  for (int i = 0; i < jsonArray.size(); i++) {
		   JsonElement jsonElement = jsonArray.get(i);
		   if (jsonElement.isJsonNull()) {
		    list.add("null");
		   } else if (jsonElement.isJsonArray()) {
		    list.add(parserArrays(jsonElement.getAsJsonArray()));
		   } else if (jsonElement.isJsonObject()) {
		    list.add(parserJsonObjecet(jsonElement.getAsJsonObject()));
		   } else if (jsonElement.isJsonPrimitive()) {
		    list.add(jsonElement.getAsString());
		   }
		  }
		  return list;
		 }
	 
	 private static Map<String, Object> parserJsonObjecet(JsonObject jsonObject) {
		  Map<String, Object> map = new HashMap<String, Object>();
		  Set<Entry<String, JsonElement>> set = jsonObject.entrySet();
		  for (Entry<String, JsonElement> entry : set) {
		   if (entry.getValue().isJsonPrimitive()) {
		    map.put(entry.getKey(), entry.getValue().getAsString());
		   } else if (entry.getValue().isJsonNull()) {
		    map.put(entry.getKey(), "null");
		   } else if (entry.getValue().isJsonArray()) {
		    map.put(entry.getKey(), parserArrays(entry.getValue().getAsJsonArray()));
		   } else if (entry.getValue().isJsonObject()) {
		    map.put(entry.getKey(), parserJsonObjecet(entry.getValue().getAsJsonObject()));
		   }
		  }
		  return map;
		 }



	/**
	 * 从Json中获取自定义的code
	 *
	 * @param json
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String getCustomCode(String json, String codeParam) {
		// 创建一个JsonParser
		JsonParser parser = new JsonParser();
		String result = "";
		try {
			JsonElement jsonEl = parser.parse(json);
			JsonObject jsonObj = null;
			jsonObj = jsonEl.getAsJsonObject();// 转换成Json对象
			result = jsonObj.get(codeParam).getAsString();// parameter节点
		} catch (Exception e) {
			// TODO: handle exception
		}
		return result;
	}

	/**
	 * 从Json中获取某个String
	 * 
	 * @param json
	 * @param parameter
	 *            String对应的参数名
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String getString(String json, String parameter) {
		// 创建一个JsonParser
		JsonParser parser = new JsonParser();
		String result = "";
		try {
			JsonElement jsonEl = parser.parse(json);
			JsonObject jsonObj = null;
			jsonObj = jsonEl.getAsJsonObject();// 转换成Json对象
			result = jsonObj.get(parameter).getAsString();// parameter节点
		} catch (Exception e) {
			// TODO: handle exception
		}
		return result;
	}

	/**
	 * 从Json中获取parameter对应实体信息
	 * 
	 * @param json
	 *            服务端返回的JSON
	 * @param cls
	 * @param parameter 实体的参数名
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getData(String json, Class<T> cls, String parameter) {
		// 创建一个JsonParser
		JsonParser parser = new JsonParser();
		JsonObject jsonObj = null;
		T t = null;
		try {
			JsonElement jsonEl = parser.parse(json);
			jsonObj = jsonEl.getAsJsonObject();// 转换成Json对象
			JsonObject result = jsonObj.get(parameter).getAsJsonObject();// parameter节点
			t = mGson.fromJson(result, cls);
		} catch (Exception e) {
			if (e != null) {
				LogUtil.w(TAG, StringUtils.getExceptionMsg(e));
			}
		}
		return t;
	}

}
